//
//  SQLiteDataBaseManger.m
//  18-SQLite
//
//  Created by GivenBmli on 16/8/8.
//  Copyright © 2016年 GivenBmli. All rights reserved.
//

#import "SQLiteDataBaseManger.h"
#import "Student.h"
@implementation SQLiteDataBaseManger
//单例创建方式, 只有一个对象
//内存管理中,单例不能被释放
+ (SQLiteDataBaseManger *)shareManger {
    static SQLiteDataBaseManger *manager = nil;
//    保证线程安全的情况下,只执行一次
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[SQLiteDataBaseManger alloc]init];
        
    });
    
    
    return manager;
}
- (BOOL)openSQLite3 {
  
  NSArray *pathArray =   NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *document = [pathArray firstObject];
//    数据库SQLite3文件夹.db
    NSString *dbPath =  [document stringByAppendingPathComponent:@"student.db"];
    NSLog(@"DbPath---%@",dbPath);
//    UTF8String属性,将OC字符串转换成C语言字符串
//    参数1:数据库文件路径
//    参数2:指向指针的指针 该指针可以被修改 数据库管理指针
   int result = sqlite3_open([dbPath UTF8String], &dbPoint);
//    BOOL isOpen = YES;
//   sqlite3_open 当路径文件不存在时,文件会被SQLite创建并打开
//    当路径文件存在时,文件被直接打开
//    sqlite3_open 返回值为int型 ,0 SQLITE_OK 代表成功; 1代表失败;
//    if (result == SQLITE_OK ) {
//        NSLog(@"数据库打开成功");
//        isOpen = YES;
//    }else {
//        NSLog(@"数据库打开失败--- %d",result);
//        isOpen = NO;
//    }
//    return isOpen;
    return [self isOperationResult:result alerText:@"打开数据库"];
}
- (BOOL)closeSQLite3 {
//    关闭数据时, 如果数据库处于打开状态,则正常关闭显示成功
//    如果数据库处于关闭装态则显示失败 原因21 库不存在

  int result = sqlite3_close(dbPoint);
    return [self isOperationResult:result alerText:@"关闭数据库"];
}
- (BOOL)createTable {
//    SQL语句
//    创建表
//    creat table 表名 (字段1, 类型, 约束, 字段2, 字段3......)
//    primary key 一个表,有且只能有一个主键
//    autoincrement 自增,添加完该字段,系统会自己创建一个数据库 sqlite_squence 用来保存自增的值
//    not null 不能为空,为空会报SQL错误
//    删除 表
//    SQL语句:drop table 表名
    NSString *createSQL = @"create table stu(stu_id integer primary key, stu_name text)";
//     NSString *createSQL = @"create table stu2(stu_id integer primary key autoincrement, stu_name text not null)";
    
  int result = sqlite3_exec(dbPoint, [createSQL UTF8String], NULL, NULL, NULL);
    return [self isOperationResult:result alerText:@"创建表"];
}
- (BOOL)insertStu:(Student *)stu {
 //   NSString *insertSQL = [NSString stringWithFormat:@"insert into stu2 values (%ld, '%@')",stu.stu_id,stu.stu_name];
//     自增字段 ,autoincrement
//    默认 如果填入null ,值会从其他值开始,例:填入110 值从110开始计算,并进行存储
//    存储在 sqlite3_squence中
    NSString *insertSQL = @"insert into stu2 values(110, '郭宝')";
    
  int result = sqlite3_exec(dbPoint , [insertSQL UTF8String], NULL, NULL, NULL);
    
    
    return [self isOperationResult:result alerText:@"添加"];
}
- (BOOL)deleteStu:(Student *)stu {
    NSString *deleteSQL = [NSString stringWithFormat:@"delete from stu1 where stu_id = %ld",stu.stu_id];
   int result = sqlite3_exec(dbPoint, [deleteSQL UTF8String], NULL, NULL, NULL);
    NSString *alerText = [NSString  stringWithFormat:@"删除学号为%ld的数据",stu.stu_id];
    return [self isOperationResult:result alerText:alerText];
}
- (BOOL)deleteAll {
    NSString *deleteSQL = @"delete from stu2 where 1 = 1";
    int result = sqlite3_exec(dbPoint, [deleteSQL UTF8String], NULL, NULL, NULL);
    return [self isOperationResult:result alerText:@"全部"];
}
- (BOOL)updateOldName:(NSString *)oldName newName:(NSString *)newName {
//    update 表名 set 字段 = 新值 where 字段名 = 旧值
    NSString *updateSQL = [NSString stringWithFormat:@"update stu2 set stu_name = '%@' where stu_name = '%@'",newName, oldName];
    int result = sqlite3_exec(dbPoint, [updateSQL UTF8String], NULL, NULL, NULL);
    return [self isOperationResult:result alerText:@"更新"];
}
- (NSArray *)selectAll {
//    select 字段名, 字段名... form 表名 where 条件
    NSString *selectAll = @"select * from stu2";
//    替身指针
    sqlite3_stmt *stmt = NULL;
//    参数1:数据库指针sqlite3*
//    参数2:SQL语句
//    参数3:SQL语句的长度,-1
//    参数4:替身,查询出的内容放入替身中,并将替身返回
   int result =  sqlite3_prepare(dbPoint, [selectAll UTF8String], -1, &stmt, NULL);
    NSMutableArray *stuArray = [NSMutableArray array];
//    如果查询结果为成功
    if (result == SQLITE_OK) {
//        循环,遍历替身内容,
//        step 查询替身中有没有其他数据,
//        当包含有其他数据时,结果为SQLITE_ROW
//        当不包含其他数据时,结果为SQLITE_DENY
        while (sqlite3_step(stmt) == SQLITE_ROW) {
//            循环体中,取对应的每一列数据
//            取出第0列的数据,根据类型选择函数,int
            int stu_id = sqlite3_column_int(stmt, 0);
//            取出第1列数据,根据数据类型选择函数,text
           const unsigned char *stu_name =  sqlite3_column_text(stmt ,1);
            Student *stu = [[Student alloc]init];
            stu.stu_id = stu_id;
            stu.stu_name = [NSString stringWithUTF8String:(const char *)stu_name];
            [stuArray addObject:stu];
        }
    }
//    循环结束处理完数据后,销毁替身
//    循环结束后一定要销毁
    sqlite3_finalize(stmt);
    return stuArray;
}
- (BOOL)isOperationResult:(int)result alerText:(NSString *)text {
    BOOL isOperation = YES;
    if (result == SQLITE_OK) {
        NSLog(@"%@成功",text);
        isOperation = YES;
    }else {
        NSLog(@"%@失败",text);
        isOperation = NO;
    }
    
    return isOperation;
}

@end
